/*
 * @(#)XfspMFMergerFactory.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.types;

import xfuzzy.xfsp.controller.XfspStore;

/**
 * <p> <b>Descripci�n:</b> contruye objetos que fusionan funciones de
 * pertenencia similares.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 2.1
 * @see XfspModel
 * @see XfspTypeSimplifier
 *
 */
public class XfspMFMergerFactory
    implements IXfspMFMergerFactory {

  //instancia de la f�brica de objetos que fusionan funciones de pertenencia
  //que hace posible que en el sistema haya solamente una instancia como m�ximo
  //en todo momento
  static private XfspMFMergerFactory instance = null;

  /**
   * <p> <b>Descripci�n:</b> crea una f�brica de objetos que fusionan funciones
   * de pertenencia.
   *
   */
  private XfspMFMergerFactory() {
  }

  /**
   * <p> <b>Descripci�n:</b> devuelve una f�brica de objetos que fusionan
   * funciones de pertenencia similares. Dicha f�brica s�lo se crea la primera
   * vez que se llama a este m�todo y el resto de las veces se devuelve la
   * misma instancia.
   * @return Devuelve una f�brica de simplificadores de tipos.
   *
   */
  static public XfspMFMergerFactory getInstance() {
    //si no se ha creado todav�a ninguna f�brica...
    if (instance == null) {
      //...crea una nueva
      instance = new XfspMFMergerFactory();
    }
    //devuelve la f�brica que hay creada
    return instance;
  }

  /**
   * <p> <b>Descripci�n:</b> devuelve un objeto que fusiona funciones de
   * pertenencia similares.
   * @param mf1Name Nombre de la primera de las funciones de pertenencia.
   * @param mf2Name Nombre de la segunda de las funciones de pertenencia.
   * @param similarityDegree Grado de similaridad entre las dos funciones.
   * @param store Almac�n donde se almacenan los eventos.
   * @return Objeto que fusiona funciones de pertenencia similares.
   *
   */
  public IXfspMFMerger create(String mf1Name, String mf2Name,
                              double similarityDegree, XfspStore store) {
    IXfspMFMerger merger = null;

    if (mf1Name.equals("trapezoid") && mf2Name.equals("trapezoid")) {
      merger = new XfspTrapezoidMFMerger();
    }
    else if (mf1Name.equals("triangle") && mf2Name.equals("triangle")) {
      merger = new XfspTriangleMFMerger();
    }
    else if (mf1Name.equals("isosceles") && mf2Name.equals("isosceles")){
      merger = new XfspIsoscelesMFMerger();
    }
    else if  (mf1Name.equals("rectangle") && mf2Name.equals("rectangle")) {
      merger = new XfspRectangleMFMerger();
    }
    else if (mf1Name.equals("bell") && mf2Name.equals("bell")) {
      merger = new XfspBellMFMerger();
    }
    else {
      XfspCustomMFMerger customMerger = new XfspCustomMFMerger();
      customMerger.setStore(store);
      customMerger.setSimilarityDegree(similarityDegree);
      merger = customMerger;
    }
    return merger;
  }
}
